﻿package net.wangit;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;

import net.wangit.util.Checker;
import net.wangit.util.StringUtil;


/**
 * MapList的行对象。
 * 
 * @author watson Feb 24, 2010
 */
@SuppressWarnings("serial")
public final class Row implements Serializable {

	private Map<String, Integer> mapping1; //<列名，列索引>
	private Map<Integer, String> mapping2; //<列索引，列名>
	private String[] values;
	private int index;

	protected Row(Map<String, Integer> mapping1, Map<Integer, String> mapping2) {
		index = -1;
		this.mapping1 = mapping1;
		this.mapping2 = mapping2;
		values = new String[mapping1.size()];
	}

	// 取得指定列序号的值。
	public String get(int columnIndex) {
		if (columnIndex >= values.length || columnIndex < 0)
			return null;
		else
			return values[columnIndex];
	}

	// 取得指定列的值，值为null时返回默认值。
	public String get(int columnIndex, String defaultValue) {
		String value = get(columnIndex);
		return value != null ? value : defaultValue;
	}

	// 取得指定名称的值。
	public String get(String key) {
		Integer index = mapping1.get(key);
		if (index == null)
			return null;
		else
			return get(index.intValue());
	}

	// 取得指定名称的值，值为null时返回默认值。
	public String get(String key, String defaultValue) {
		String value = get(key);
		return value != null ? value : defaultValue;
	}

	// 取得指定列的值，并转换为double类型，值为空时返回默认值。
	public double getDouble(int columnIndex, double defaultValue) {
		String value = get(columnIndex);
		return Checker.isEmpty(value) ? defaultValue : Double
				.parseDouble(value);
	}

	// /取得指定列的值，并转换为double类型，值为空时返回默认值。
	public double getDouble(String key, double defaultValue) {
		String value = get(key);
		return Checker.isEmpty(value) ? defaultValue : Double
				.parseDouble(value);
	}

	// 取得指定列的值，并转换为float类型，值为空时返回默认值。
	public float getFloat(int columnIndex, float defaultValue) {
		String value = get(columnIndex);
		return Checker.isEmpty(value) ? defaultValue : Float.parseFloat(value);
	}

	// 取得指定名称的值，并转换为float类型，值为空时返回默认值。
	public float getFloat(String key, float defaultValue) {
		String value = get(key);
		return Checker.isEmpty(value) ? defaultValue : Float.parseFloat(value);
	}

	// 取得行序号。
	public int getIndex() {
		return index;
	}

	// 取得指定列的值，并转换为int类型，值为空时返回默认值。
	public int getInt(int columnIndex, int defaultValue) {
		String value = get(columnIndex);
		return Checker.isEmpty(value) ? defaultValue : Integer.parseInt(value);
	}

	// 取得指定列的值，并转换为int类型，值为空时返回默认值。
	public int getInt(String key, int defaultValue) {
		String value = get(key);
		return Checker.isEmpty(value) ? defaultValue : Integer.parseInt(value);
	}

	// 取得指定列序号的名称。
	public String getKey(int columnIndex) {
		return mapping2.get(new Integer(columnIndex));
	}

	// 取得指定列的值，并转换为long类型，值为空时返回默认值。
	public long getLong(int columnIndex, long defaultValue) {
		String value = get(columnIndex);
		return Checker.isEmpty(value) ? defaultValue : Long.parseLong(value);
	}

	// 取得指定名称的值，并转换为long类型，值为空时返回默认值。
	public long getLong(String key, long defaultValue) {
		String value = get(key);
		return Checker.isEmpty(value) ? defaultValue : Long.parseLong(value);
	}

	// 打印行数据，输出到控制台。
	public void print() {
		for (int i = 0; i < values.length; i++)
			System.out.println((new StringBuilder(StringUtil.fill(getKey(i),
					20, ' ', true))).append(values[i]));

	}

	// 设置数据。
	protected void put(String key, String value) {
		int index = putIndex(key);
		if (index >= values.length)
			values = resize();
		values[index] = value;
	}

	private int putIndex(String key) {
		Integer i = mapping1.get(key);
		if (i == null) {
			int index = mapping1.size();
			Integer intIndex = new Integer(index);
			mapping1.put(key, intIndex);
			mapping2.put(intIndex, key);
			return index;
		} else {
			return i.intValue();
		}
	}

	private String[] resize() {
		String[] newValues = new String[mapping1.size()];
		for (int i = 0; i < values.length; i++)
			newValues[i] = values[i];

		return newValues;
	}

	// 设置行序号
	protected void setIndex(int index) {
		this.index = index;
	}

	// 取得列数。
	public int size() {
		return values.length;
	}

	// 创建一个Map对象，包含Row对象的所有数据。
	public Map<String, String> toMap() {
		Map<String, String> map = new HashMap<String, String>();
		for (int i = 0; i < values.length; i++)
			map.put(getKey(i), values[i]);

		return map;
	}
}
